#列表推导
list_comp = [x ** 2 for x in range(10) if x % 2 == 0]

##生成器表达式:和列表推导类似，唯一的区别是你使用括号而不是方括号；但它生成的是一个生成器对象，而不是一个实际的列表。
# 生成器对象是一个可迭代的对象，它在每次迭代时都会生成新的值，而不是一次性生成所有的值。
# 一个生成器既是可迭代的也是迭代器，定义生成器有两种方式：1）列表生成器，2）使用yield定义生成器函数

#第一种列表生成器、
gen_exp = (x ** 2 for x in range(10) if x % 2 == 0)

#第二种：这里yield的作用就相当于return,这个函数就是顺序地返回[0,10)的之间的自然数，可以通过next()或使用for循环来遍历。
#当程序遇到yield关键字时，这个生成器函数就返回了，直到再次执行了next()函数，它就会从上次函数返回的执行点继续执行，
# 即yield退出时保存了函数执行的位置、变量等信息，再次执行时，就从这个yield退出的地方继续往下执行。
def gen():
    for i in range(10):  #3  #7
        yield i  #4  #8
        print(i) #6

if __name__ == "__main__":
    #print(list_comp) #[0, 4, 16, 36, 64]
    #print(gen_exp) #<generator object <genexpr> at 0x000001A4883A0D48> 是可迭代(Iterable)
    #print(gen_exp.__next__()) #0  调用__next__就变成迭代器（Iterator ）

    #print(gen) #<function gen at 0x000002467FA7D1F8>
    num=gen()   #1
    for i in num:  #2
        print(f'for循环：{i}') #5  #9
